#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
视频导出模块
负责将标记的片段拼接并导出为新视频，保持原始质量
"""

import os
import ffmpeg
from typing import List, Optional
from src.video.segment_manager import VideoSegment, SegmentType


class VideoExporter:
    """视频导出器类"""

    def __init__(self):
        """初始化视频导出器"""
        pass

    def export_video(self, input_video_path: str, segments: List[VideoSegment], 
                     output_path: str, progress_callback=None) -> bool:
        """
        导出视频片段拼接结果
        
        Args:
            input_video_path (str): 输入视频文件路径
            segments (List[VideoSegment]): 要拼接的片段列表
            output_path (str): 输出视频文件路径
            progress_callback (callable): 进度回调函数
            
        Returns:
            bool: 导出成功返回True，否则返回False
        """
        if not input_video_path:
            print("错误：输入视频文件路径为空")
            if progress_callback:
                progress_callback(0)
            return False

        if not os.path.exists(input_video_path):
            print(f"错误：输入视频文件不存在 {input_video_path}")
            if progress_callback:
                progress_callback(0)
            return False

        if not segments:
            print("错误：没有要导出的片段")
            if progress_callback:
                progress_callback(0)
            return False

        try:
            # 过滤出保留片段并按时间排序
            keep_segments = [seg for seg in segments if seg.segment_type == SegmentType.KEEP]
            keep_segments.sort(key=lambda s: s.start_time)
            
            if not keep_segments:
                print("错误：没有保留片段可供导出")
                if progress_callback:
                    progress_callback(0)
                return False

            # 更新进度
            if progress_callback:
                progress_callback(10)

            # 使用ffmpeg的concat demuxer方式拼接视频（保持原始质量）
            # 创建临时文件列表
            temp_file_list = self._create_temp_file_list(input_video_path, keep_segments)
            
            if temp_file_list is None:
                if progress_callback:
                    progress_callback(0)
                return False

            # 更新进度
            if progress_callback:
                progress_callback(30)

            # 执行拼接操作
            self._concat_videos(temp_file_list, output_path, progress_callback)
            
            # 更新进度
            if progress_callback:
                progress_callback(90)

            # 清理临时文件
            self._cleanup_temp_files(temp_file_list)
            
            # 完成进度
            if progress_callback:
                progress_callback(100)
            
            print(f"视频导出成功: {output_path}")
            return True
            
        except Exception as e:
            print(f"导出视频时出错: {e}")
            if progress_callback:
                progress_callback(0)
            return False

    def _create_temp_file_list(self, input_video_path: str, segments: List[VideoSegment]) -> Optional[str]:
        """
        创建临时文件列表用于ffmpeg拼接
        
        Args:
            input_video_path (str): 输入视频文件路径
            segments (List[VideoSegment]): 片段列表
            
        Returns:
            str: 临时文件列表路径，None表示创建失败
        """
        try:
            # 检查输入参数
            if not input_video_path or not segments:
                print("错误：输入参数无效")
                return None
                
            # 创建临时文件列表
            temp_file_list = f"/tmp/file_list_{os.getpid()}.txt"
            
            with open(temp_file_list, 'w') as f:
                for segment in segments:
                    # 使用ffmpeg的concat demuxer格式
                    f.write(f"file '{input_video_path}'\n")
                    f.write(f"inpoint {segment.start_time}\n")
                    f.write(f"outpoint {segment.end_time}\n")
                    f.write("\n")
            
            return temp_file_list
            
        except Exception as e:
            print(f"创建临时文件列表时出错: {e}")
            return None

    def _concat_videos(self, file_list_path: str, output_path: str, progress_callback=None):
        """
        使用ffmpeg拼接视频片段
        
        Args:
            file_list_path (str): 文件列表路径
            output_path (str): 输出文件路径
            progress_callback (callable): 进度回调函数
        """
        try:
            # 使用concat demuxer方式拼接，保持原始质量（stream copy）
            # -f concat: 使用concat demuxer
            # -safe 0: 允许不安全的文件路径
            # -i: 输入文件列表
            # -c copy: 直接复制流，不重新编码（保持原始质量）
            # -avoid_negative_ts make_zero: 处理负时间戳
            # -y: 覆盖输出文件
            
            (
                ffmpeg
                .input(file_list_path, f='concat', safe=0)
                .output(output_path, c='copy', avoid_negative_ts='make_zero', y=None)
                .overwrite_output()
                .run(capture_stdout=True, capture_stderr=True)
            )
            
            if progress_callback:
                progress_callback(100)
                
        except ffmpeg.Error as e:
            print(f"FFmpeg错误: {e.stderr.decode()}")
            raise
        except Exception as e:
            print(f"拼接视频时出错: {e}")
            raise

    def _cleanup_temp_files(self, temp_file_list: str):
        """
        清理临时文件
        
        Args:
            temp_file_list (str): 临时文件列表路径
        """
        try:
            if os.path.exists(temp_file_list):
                os.remove(temp_file_list)
        except Exception as e:
            print(f"清理临时文件时出错: {e}")

    def get_video_info(self, video_path: str) -> Optional[dict]:
        """
        获取视频信息
        
        Args:
            video_path (str): 视频文件路径
            
        Returns:
            dict: 视频信息字典
        """
        try:
            probe = ffmpeg.probe(video_path)
            return probe
        except Exception as e:
            print(f"获取视频信息时出错: {e}")
            return None


if __name__ == "__main__":
    # 测试代码
    exporter = VideoExporter()
    # 示例使用方式